package it.agilis.mens.azzeroCO2.client.components.uploadFiles; import com.extjs.gxt.ui.client.event.*; import com.extjs.gxt.ui.client.store.StoreEvent; import com.extjs.gxt.ui.client.store.StoreListener; import com.extjs.gxt.ui.client.widget.Window; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.FileUploadField; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.Node; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.FormPanel; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.icons.UploadIcons; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.model.FileUploadModel; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.model.Model; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.FilePanelDecorator; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.FileStackPanel; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.FormPanelDecorator; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.UploadFormPanel; import it.agilis.mens.azzeroCO2.client.components.uploadFiles.utils.MultiUploadUtils; public class MultiUploadView extends Window implements MultiUploadPresenter.Display { private static final int ADD_BUTTON_WIDTH = 78; private UploadFormPanel formPanel; protected Grid<Model> grid; private FileUploadField addButton; private Button uploadButton; private FileStackPanel filePanel; private ToolBar toolBar; private Listener<FieldEvent> addClickListener; public MultiUploadView(Grid<Model> grid) { setBodyBorder(true); setWidth(550); setHeight(300); setMinWidth(550); setMinHeight(300); setIcon(UploadIcons.INSTANCE.upload()); setHeading(UploadConstants.INSTANCE.dialogTitle()); setModal(true); setPlain(false); setLayout(new FitLayout()); this.grid = grid; add(grid); addGridListeners(); setBottomComponent(createToolbar()); add(createFormPanel()); add(createFilePanel()); } public FileUploadModel parseModel(String json) { JSONObject jsonObject = (JSONObject) JSONParser.parseLenient(json); String name = getPropertyValue(jsonObject, FileUploadModel.NAME); String state = getPropertyValue(jsonObject, FileUploadModel.STATE); String message = getPropertyValue(jsonObject, FileUploadModel.MESSAGE); return new FileUploadModel(name, UploadState.valueOf(state), message); } public void exchangeAddButton() { FileUploadField oldAddButton = addButton; addButton.removeFromParent(); toolBar.insert(createAddButton(), 0); filePanel.addFileInput(oldAddButton.getFileInput()); } public void upload() { uploadButton.disable(); Node firstChild = filePanel.getElement().getFirstChild(); if (firstChild != null) { InputElement input = firstChild.cast(); formPanel.addFileInput(input); formPanel.submit(); updateModelState(MultiUploadUtils.removeFilePath(input.getValue()), UploadState.UPLOADING); } } public void setAccept(String accept) { addButton.setAccept(accept); } @Override public void addModel(Model model) { grid.getStore().add(model); } @Override public void removeModel(Model model) { grid.getStore().remove(model); } @Override public Model findModel(String filename) { return grid.getStore().findModel(FileUploadModel.NAME, filename); } @Override public Model getSelectedModel() { return grid.getSelectionModel().getSelectedItem(); } @Override public void setAddButtonListener(Listener<FieldEvent> listener) { addClickListener = listener; addButton.addListener(Events.OnChange, listener); } @Override public String getCurrentFile() { return addButton.getValue(); } @Override public void setUploadButtonListener(SelectionListener<ButtonEvent> listener) { uploadButton.addSelectionListener(listener); } @Override public FilePanelDecorator getFileStackPanel() { return filePanel; } @Override public FormPanelDecorator getFormPanel() { return formPanel; } private FormPanel createFormPanel() { formPanel = new UploadFormPanel(); formPanel.setMethod(FormPanel.METHOD_POST); formPanel.setEncoding(FormPanel.ENCODING_MULTIPART); formPanel.setVisible(false); return formPanel; } private AbsolutePanel createFilePanel() { filePanel = new FileStackPanel(); filePanel.setVisible(false); return filePanel; } private String getPropertyValue(JSONObject object, String property) { JSONString state = (JSONString) object.get(property); return state.stringValue(); } private ToolBar createToolbar() { toolBar = new ToolBar(); toolBar.setBorders(false); toolBar.add(createAddButton()); toolBar.add(createUploadButton()); return toolBar; } private FileUploadField createAddButton() { addButton = new FileUploadField(); addButton.setName("file"); addButton.setWidth(ADD_BUTTON_WIDTH); addButton.setButtonIcon(UploadIcons.INSTANCE.add()); addButton.setInputStyleAttribute("display", "none"); addButton.addListener(Events.OnChange, addClickListener); return addButton; } private void addGridListeners() { grid.getStore().addStoreListener(new StoreListener<Model>() { @Override public void storeAdd(StoreEvent<Model> se) { uploadButton.enable(); } }); } private Button createUploadButton() { uploadButton = new Button(UploadConstants.INSTANCE.upload()); uploadButton.setIcon(UploadIcons.INSTANCE.upload()); uploadButton.disable(); return uploadButton; } private void updateModelState(String fileName, UploadState state) { Model model = findModel(fileName); model.setState(state); model.setMessage(state.getLabel()); } }